#ifndef BASECLIENT_H
#define BASECLIENT_H

#include <memory>
#include <functional>
#include <vector>
#include <string>

namespace BORNS {
class TcpClient;
}

namespace CURCONTROL {

/*!
* \brief UR客户端基类：负责最基础的通信链接、断开、重连功能
*/
class BaseClient
{
protected:
    std::shared_ptr<BORNS::TcpClient> tcpClient_;
public:
    BaseClient();
    virtual ~BaseClient();
    /*!
   * \brief 激活接收线程
   */
    void EnableReceiveThread();
    /*!
   * \brief 与客户端断开TCP链接
   */
    void Disconnect();
    /*!
   * \brief 与客户端重新链接
   *
   * \returns 链接成功返回true
   */
    virtual bool Reconnect();
    /*!
   * \brief 是否链接
   *
   * \returns 链接成功返回true
   */
    bool IsConnected() const;
    /*!
   * \brief 调用该接口的前提必须是已成功建立链接，否则该函数返回false
   * \brief 开启接收线程：按照应用协议需要的数据长度接收数据包，并回调解析函数
   * \brief 解析后的字节需自行删除
   *
   * \param[in] 解析函数
   */
    bool StartReceiveThread(std::function<void(std::vector<uint8_t> &bytes)> parseFunc);
    /*!
   * \brief Determines the IP address of the local machine
   *
   * \returns The IP address of the local machine.
   */
    std::string GetIP() const;
    /*!
   * \brief 设置链接状态改变回调
   */
//    void SetConnectStatusChangedCallback(std::function<void(bool status)> statusChangedFunc);
protected:
    /*!
   * \brief 与客户端建立TCP链接
   *
   * \param[in] 服务端ip
   * \param[in] 服务端端口号
   * \param[in] 是否检测select超时错误
   *
   * \returns 链接成功返回true
   */
    bool Connect(const std::string& host, int port, bool checkSelectTimeoutError);
    virtual void Clear() = 0;// 清除自身状态
};

}// namespace CURCONTROL

#endif // BASECLIENT_H
